/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.documentar.DAO;

import br.com.documentar.interfacee.InterfaceDAO;
import br.com.documentar.model.CategoriaArvoreModel;
import br.com.documentar.model.ConsultarDocumentoModel;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Santos
 */
public class ConsultarDocumentoDAO extends AbstractDAO
        implements InterfaceDAO<List<br.com.documentar.model.ConsultarDocumentoModel>, br.com.documentar.model.ConsultarDocumentoModel> {

    /**
     * Melhorar esse metodo, colocar uma thread para fazer o trabalho, pois esse
     * meio está consumindo grande parte das conexões - REFAZER
     *
     * @param categoria
     * @param lista
     * @return
     */
    public List<CategoriaArvoreModel> getCaminhoCategoria(int categoria, List<CategoriaArvoreModel> lista) {
        try {
            rs = Select("SELECT 	"
                    + "  `categoria`.`TCAT_CODIGO_PK`,"
                    + "  `categoria`.`TCAT_CODIGO_PROCESSO`,\n"
                    + "  `categoria`.`TCAT_NOME`,\n"
                    + "   COALESCE(`categoria`.`TCAT_CATEGORIA_PAI_FKN`, 0) TCAT_CATEGORIA_PAI_FKN, "
                    + "   `categoria`.`TCAT_TEM_FILHO` "
                    + "\n"
                    + "FROM \n"
                    + "  `tcat_categoria` categoria \n"
                    + "  where `categoria`.`TCAT_CODIGO_PK` = " + categoria + "", "Consultar Documento");
            while (rs.next()) {
                CategoriaArvoreModel categoriaModel = new CategoriaArvoreModel();
                categoriaModel.setCodigo(rs.getInt("TCAT_CODIGO_PK"));
                categoriaModel.setCodigoProcesso(rs.getString("TCAT_CODIGO_PROCESSO"));
                categoriaModel.setNome(rs.getString("TCAT_NOME"));
                categoriaModel.getCodigoPai().setCodigo(rs.getInt("TCAT_CATEGORIA_PAI_FKN"));
                categoriaModel.setTemFilho(rs.getString("TCAT_TEM_FILHO").charAt(0));
                lista.add(categoriaModel);
                if (categoriaModel.getCodigoPai().getCodigo() != 0) {
                    //rever
                    getCaminhoCategoria(lista.get(lista.size() - 1).getCodigoPai().getCodigo(), lista);
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConsultarDocumentoDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
        }
        return lista;
    }

    /**
     * Montar o caminho
     *
     * @param model
     * @return
     */
    public String getCategoria(ConsultarDocumentoModel model) {
        ConnectDataBase();
        List<CategoriaArvoreModel> listaCategoria = new ArrayList<>();
        getCaminhoCategoria(model.getCategoriaVersao().getCategoria().getCodigo(), listaCategoria);
        String caminho = "";
        String seta = "";
        for (int i = listaCategoria.size() - 1; 0 <= i; i--) {
            if (listaCategoria.get(i).getTemFilho() == 'S') {
                seta = "->";
            } else {
                seta = "";
            }
            caminho = caminho.concat(listaCategoria.get(i).getCodigoProcesso() + " - " + listaCategoria.get(i).getNome() + " " + seta);
        }
        Desconectar(model.getNomeTela());
        return caminho;
    }

    public String getCategoriaSemItemProprio(ConsultarDocumentoModel model) {
        ConnectDataBase();
        List<CategoriaArvoreModel> listaCategoria = new ArrayList<>();
        getCaminhoCategoria(model.getCategoriaVersao().getCategoria().getCodigo(), listaCategoria);
        String caminho = "";
        String seta = "";
        //esse não considera o último item da arvore, pois estaria considerando si proprio. 
        //observe a condição de para do for é 1
        for (int i = listaCategoria.size() - 1; 1 <= i; i--) {
            if (listaCategoria.get(i).getTemFilho() == 'S') {
                seta = "->";
            } else {
                seta = "";
            }
            caminho = caminho.concat(listaCategoria.get(i).getCodigoProcesso() + " - " + listaCategoria.get(i).getNome() + " " + seta);
        }
        if (caminho.equals("")) {
            caminho = "RAIZ";
        }
        Desconectar(model.getNomeTela());
        return caminho;
    }

    @Override
    public boolean setDados(ConsultarDocumentoModel model) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public List<ConsultarDocumentoModel> getDados(ConsultarDocumentoModel model) {
        model.setResultSet(null);
        model.getListaConsultarDocumento().clear();
        String sql = "select  `documento`.`TDOC_CODIGO_PK`,\n"
                + "		`produto`.`TPRO_CODIGO_PK`,\n"
                + "		`produto`.`TPRO_NOME`,\n"
                + "        `versao`.`TVER_CODIGO_PK`,\n"
                + "        `versao`.`TVER_NOME`,\n"
                + "        `categoria`.`TCAT_CODIGO_PK`,\n"
                + "        `fnc_caminho_completo`(`categoria`.`TCAT_CODIGO_PK`) TCAT_NOME,\n"
                + "        `tela`.`TTEL_CODIGO_PK`,\n"
                + "        `fnc_caminho_completo_tela`(`tela`.`TTEL_CODIGO_PK`) TTEL_NOME,\n"
                + "        `documento`.`TDOC_ABA`,\n"
                + "        `documento`.`TDOC_POSICAO`,\n"
                + "        `documento`.`TDOC_CAMPO`,\n"
                + "        `documento`.`TDOC_FUNCAO_PARAMETRO`,\n"
                + "        `documento`.`TDOC_EXEMPLO`,\n"
                + "        `documento`.`TDOC_IMAGEM_TELA`,\n"
                + "        `documento`.`TDOC_LINK_VIDEO`,\n"
                + "        `documento`.`TDOC_ANEXO`,\n"
                + "        COALESCE(`tabelaVersao`.`TLNK_TIPO_BANCO`, 0) TLNK_TIPO_BANCO ,\n"
                + "        COALESCE(`tabelaVersao`.`TLNK_NOME_BANCO_DADOS`, 0) TLNK_NOME_BANCO_DADOS,\n"
                + "        COALESCE(`tabela`.`TTAB_CODIGO_PK`, 0) TTAB_CODIGO_PK,\n"
                + "        COALESCE(`tabela`.`TTAB_NOME`, 0) TTAB_NOME,\n"
                + "        COALESCE(`tabela`.`TTAB_NOME_AMIGAVEL`, 0) TTAB_NOME_AMIGAVEL,\n"
                + "        COALESCE(`tabelaVersao`.`TLNK_ACAO`, 0) TLNK_ACAO,\n"
                + "        COALESCE(`tabelaVersao`.`TLNK_TABLESPACE`, 0) TLNK_TABLESPACE,\n"
                + "        COALESCE(`tabelaVersao`.`TLNK_TEMPORARIA`, 0) TLNK_TEMPORARIA,\n"
                + "        COALESCE(`tabelaVersao`.`TLNK_DONO`, 0) TLNK_DONO,\n"
                + "        COALESCE(`coluna`.`TCOL_CODIGO_PK`, 0) TCOL_CODIGO_PK,\n"
                + "        COALESCE(`coluna`.`TCOL_NOME`, 0) TCOL_NOME,\n"
                + "        COALESCE(`coluna`.`TCOL_NOME_AMIGAVEL`, 0) TCOL_NOME_AMIGAVEL,\n"
                + "        COALESCE(`colunaVersao`.`TLNK_ACAO`, 0) TLNK_ACAO_COLUNA,\n"
                + "        COALESCE(`colunaVersao`.`TLNK_TIPO_DADO`, 0) TLNK_TIPO_DADO,\n"
                + "        COALESCE(`colunaVersao`.`TLNK_TAMANHO`, 0) TLNK_TAMANHO,\n"
                + "        COALESCE(`colunaVersao`.`TLNK_ACEITA_NULL`, 0) TLNK_ACEITA_NULL, \n"
                + "        COALESCE(`objetoBanco`.`TOBJ_CODIGO_PK`,0)  TOBJ_CODIGO_PK, \n"
                + "        COALESCE(`objetoBanco`.`TOBJ_NOME`,0) TOBJ_NOME,  \n"
                + "        COALESCE(`objetoBanco`.`TOBJ_NOME_AMIGAVEL`,0) TOBJ_NOME_AMIGAVEL  \n"
                + "from `tdoc_documento` `documento`\n"
                + "      left join `tlnk_doc_tab_col` `linkDocumentoTabelaColuna`\n"
                + "      on `documento`.`TDOC_CODIGO_PK` = `linkDocumentoTabelaColuna`.`TLNK_DOCUMENTO_FK_PK`\n"
                + "      left join `ttab_tabela` `tabela`\n"
                + "      on `linkDocumentoTabelaColuna`.`TLNK_TABELA_FK_PK` = `tabela`.`TTAB_CODIGO_PK`\n"
                + "      left join `tlnk_tabela_versao` `tabelaVersao`\n"
                + "      on `linkDocumentoTabelaColuna`.`TLNK_TABELA_FK_PK` = `tabelaVersao`.`TLNK_TABELA_FK_PK`\n"
                + "      and `documento`.`TDOC_VERSAO_FK` = `tabelaVersao`.`TLNK_VERSAO_FK_PK`\n"
                + "      left join `tcol_coluna` `coluna`\n"
                + "      on `linkDocumentoTabelaColuna`.`TLNK_COLUNA_FK_PK` = `coluna`.`TCOL_CODIGO_PK`\n"
                + "      left join `tlnk_coluna_versao` `colunaVersao`\n"
                + "      on `linkDocumentoTabelaColuna`.`TLNK_COLUNA_FK_PK` = `colunaVersao`.`TLNK_COLUNA_FK_PK`\n"
                + "      and `documento`.`TDOC_VERSAO_FK` = `colunaVersao`.`TLNK_VERSAO_FK_PK`\n"
                + "      left join `tlnk_documento_objeto` `documentoObjeto`\n"
                + "      on `documento`.`TDOC_CODIGO_PK` = `documentoObjeto`.`TLNK_DOCUMENTO_FK_PK`\n"
                + "      left join `tobj_objeto_banco` `objetoBanco`\n"
                + "      on `documentoObjeto`.`TLNK_OBJETO_FK_PK` = `objetoBanco`.`TOBJ_CODIGO_PK`\n"
                + "      left join `tlnk_objeto_versao` `objetoVersao`\n"
                + "      on `objetoBanco`.`TOBJ_CODIGO_PK` = `objetoVersao`.`TLNK_OBJETO_FK_PK`\n"
                + "      and `documento`.`TDOC_VERSAO_FK` = `objetoVersao`.`TLNK_VERSAO_FK_PK`\n"
                + "      inner join `tlnk_categoria_versao` `categoriaVersao`\n"
                + "      on `documento`.`TDOC_CATEGORIA_FK` = `categoriaVersao`.`TLNK_CATEGORIA_FK_PK`\n"
                + "      and `documento`.`TDOC_VERSAO_FK` = `categoriaVersao`.`TLNK_VERSAO_FK_PK`\n"
                + "      and `documento`.`TDOC_TELA_FK` = `categoriaVersao`.`TLNK_TELA_FK_PK`\n"
                + "      inner join `ttel_tela` `tela`\n"
                + "      on `categoriaVersao`.`TLNK_TELA_FK_PK` = `tela`.`TTEL_CODIGO_PK`\n"
                + "      left join `tvid_video` `video`\n"
                + "      on `categoriaVersao`.`TLNK_CATEGORIA_FK_PK` = `video`.`TVID_CATEGORIA_FK`\n"
                + "      and `categoriaVersao`.`TLNK_TELA_FK_PK` = `video`.`TVID_TELA_FK`\n"
                + "      and `categoriaVersao`.`TLNK_VERSAO_FK_PK` = `video`.`TVID_VERSAO_FK`\n"
                + "      inner join `tcat_categoria` `categoria`\n"
                + "      on `categoriaVersao`.`TLNK_CATEGORIA_FK_PK` = `categoria`.`TCAT_CODIGO_PK`\n"
                + "      inner join `tver_versao` `versao`\n"
                + "      on `categoriaVersao`.`TLNK_VERSAO_FK_PK` =  `versao`.`TVER_CODIGO_PK`\n"
                + "      inner join `tpro_produto` `produto`\n"
                + "      on `versao`.`TVER_PRODUTO_FK` = `produto`.`TPRO_CODIGO_PK` ";
        try {
            ConnectDataBase();
            switch (model.getActionScript()) {
                case "C":
                    model.setResultSet(Select(sql, model.getNomeTela()));
                    break;
                case "P":
                    model.setResultSet(Select(sql + "where `documento`.`TDOC_CODIGO_PK` = " + model.getDocumento().getCodigo() + "", model.getNomeTela()));
                    break;
                case "geral":
                    sql = sql + " where `produto`.`TPRO_CODIGO_PK` = " + model.getProduto().getCodigo() + " ";

                    if (!model.getFiltroVersao().equals("ESCOLHER") && (model.getCategoriaVersao().getVersao().getCodigo() != 0)) {
                        sql = sql + " " + model.getFiltroVersao() + " `versao`.`TVER_CODIGO_PK` = " + model.getCategoriaVersao().getVersao().getCodigo() + " ";
                    }
                    if (!model.getFiltroCategoria().equals("ESCOLHER") && model.getCategoriaVersao().getCategoria().getCodigo() != 0) {
                        sql = sql + " " + model.getFiltroCategoria() + " `categoria`.`TCAT_CODIGO_PK` = " + model.getCategoriaVersao().getCategoria().getCodigo() + " ";
                    }
                    if (!model.getFiltroTela().equals("ESCOLHER") && model.getCategoriaVersao().getTelaModel().getCodigo() != 0) {
                        sql = sql + " " + model.getFiltroCategoria() + " `tela`.`TTEL_CODIGO_PK` = " + model.getCategoriaVersao().getTelaModel().getCodigo() + " ";
                    }
                    if (!model.getFiltroAba().equals("ESCOLHER") && !model.getDocumento().getAba().equals("")) {
                        sql = sql + " " + model.getFiltroAba() + " `documento`.`TDOC_ABA` like '%" + model.getDocumento().getAba() + "%'";
                    }
                    if (!model.getFiltroPosicao().equals("ESCOLHER") && !model.getDocumento().getPosicao().equals("")) {
                        sql = sql + " " + model.getFiltroPosicao() + " `documento`.`TDOC_POSICAO` like '%" + model.getDocumento().getPosicao() + "%'";
                    }
                    if (!model.getFiltroNomeCampo().equals("ESCOLHER") && !model.getDocumento().getNomeCampo().equals("ESCOLHER")) {
                        sql = sql + " " + model.getFiltroNomeCampo() + " `documento`.`TDOC_CAMPO` like '%" + model.getDocumento().getNomeCampo() + "%'";
                    }
                    if (!model.getFiltroFuncaoParamentro().equals("ESCOLHER") && !model.getDocumento().getFuncaoParamentro().equals("")) {
                        sql = sql + " " + model.getFiltroFuncaoParamentro() + " `documento`.`TDOC_FUNCAO_PARAMETRO` like '%" + model.getDocumento().getFuncaoParamentro() + "%'";
                    }
                    if (!model.getFiltroExemplo().equals("ESCOLHER") && !model.getDocumento().getExemplo().equals("")) {
                        sql = sql + " " + model.getFiltroExemplo() + " `documento`.`TDOC_EXEMPLO` like '%" + model.getDocumento().getExemplo() + "%'";
                    }
                    if (!model.getFiltroTabela().equals("ESCOLHER") && model.getTabela().getCodigo() != 0) {
                        sql = sql + " " + model.getFiltroTabela() + " `linkDocumentoTabelaColuna`.`TLNK_TABELA_FK_PK` = " + model.getTabela().getCodigo() + "";
                    }
                    if (!model.getFiltroTabelaNomeAmigavel().equals("ESCOLHER") && !model.getTabela().getNomeAmigavel().equals("")) {
                        sql = sql + " " + model.getFiltroTabelaNomeAmigavel() + " `tabela`.`TTAB_NOME_AMIGAVEL` like '%" + model.getTabela().getNomeAmigavel() + "%' ";
                    }
                    if (!model.getFiltroColuna().equals("ESCOLHER") && model.getColuna().getCodigo() != 0) {
                        sql = sql + " " + model.getFiltroColuna() + " `linkDocumentoTabelaColuna`.`TLNK_COLUNA_FK_PK` = " + model.getColuna().getCodigo() + " ";
                    }
                    if (!model.getFiltroColunaNomeAmigavel().equals("ESCOLHER") && !model.getColuna().getNomeAmigavel().equals("")) {
                        sql = sql + " " + model.getFiltroColunaNomeAmigavel() + " `coluna`.`TCOL_NOME_AMIGAVEL` like '%" + model.getColuna().getNomeAmigavel() + "%' ";
                    }
                    if (!model.getFiltroObjeto().equals("ESCOLHER") && model.getObjetoModel().getCodigo() != 0) {
                        sql = sql + " " + model.getFiltroObjeto() + " `objetoBanco`.`TOBJ_CODIGO_PK` = " + model.getObjetoModel().getCodigo() + " ";
                    }
                    if (!model.getFiltroObjetoNomeAmigavel().equals("ESCOLHER") && !model.getObjetoModel().getNomeAmigavel().equals("")) {
                        sql = sql + " " + model.getFiltroObjetoNomeAmigavel() + " `objetoBanco`.`TOBJ_NOME_AMIGAVEL` like '%" + model.getObjetoModel().getNomeAmigavel() + "%' ";
                    }

                    model.setResultSet(Select(sql, model.getNomeTela()));
                    break;
                case "porDocumentoDocumento":
                    model.setResultSet(Select(sql + "where `documento`.`TDOC_CODIGO_PK` in "
                            + "( select `uniao1`.`TDOC_DOCUMENTO_PK1` \n"
                            + " from `tlnk_documento_documento` `uniao1`\n"
                            + " where `uniao1`.`TDOC_DOCUMENTO_PK2` = " + model.getDocumento().getCodigo() + "\n"
                            + " union \n"
                            + " select `uniao2`.`TDOC_DOCUMENTO_PK2` \n"
                            + " from `tlnk_documento_documento` `uniao2`\n"
                            + " where `uniao2`.`TDOC_DOCUMENTO_PK1` = " + model.getDocumento().getCodigo() + ")", model.getNomeTela()));
                    break;
            }

            while (model.getResultSet().next()) {
                br.com.documentar.model.ConsultarDocumentoModel p = new br.com.documentar.model.ConsultarDocumentoModel();
                p.getDocumento().setCodigo(rs.getInt("TDOC_CODIGO_PK"));
                p.getProduto().setCodigo(rs.getInt("TPRO_CODIGO_PK"));
                p.getProduto().setNome(rs.getString("TPRO_NOME"));

                p.getCategoriaVersao().getVersao().setCodigo(rs.getInt("TVER_CODIGO_PK"));
                p.getCategoriaVersao().getVersao().setNome(rs.getString("TVER_NOME"));

                p.getCategoriaVersao().getCategoria().setCodigo(rs.getInt("TCAT_CODIGO_PK"));
                p.getCategoriaVersao().getCategoria().setNome(rs.getString("TCAT_NOME"));

                p.getCategoriaVersao().getTelaModel().setCodigo(rs.getInt("TTEL_CODIGO_PK"));
                p.getCategoriaVersao().getTelaModel().setNome(rs.getString("TTEL_NOME"));

                p.getDocumento().setAba(rs.getString("TDOC_ABA"));
                p.getDocumento().setPosicao(rs.getString("TDOC_POSICAO"));
                p.getDocumento().setNomeCampo(rs.getString("TDOC_CAMPO"));
                p.getDocumento().setFuncaoParamentro(rs.getString("TDOC_FUNCAO_PARAMETRO"));
                p.getDocumento().setExemplo(rs.getString("TDOC_EXEMPLO"));
                p.getDocumento().setImagemTela(rs.getString("TDOC_IMAGEM_TELA"));
                p.getDocumento().setAnexo(rs.getString("TDOC_ANEXO"));
                p.getDocumento().setLinkVideo(rs.getString("TDOC_LINK_VIDEO"));

                /*Dados sobre as tabelas*/
                p.getTabela().setCodigo(rs.getInt("TTAB_CODIGO_PK"));
                p.getTabela().setNome(rs.getString("TTAB_NOME"));
                p.getTabela().setNomeAmigavel(rs.getString("TTAB_NOME_AMIGAVEL"));

                /*Detalhes sobre as tabelas*/
                p.getTabelaVersao().setTipoBanco(rs.getString("TLNK_TIPO_BANCO"));
                p.getTabelaVersao().setNomeBanco(rs.getString("TLNK_NOME_BANCO_DADOS"));
                p.getTabelaVersao().setAcao(rs.getString("TLNK_ACAO").charAt(0));
                p.getTabelaVersao().setTableSpace(rs.getString("TLNK_TABLESPACE"));
                p.getTabelaVersao().setTemporaria(rs.getString("TLNK_TEMPORARIA").charAt(0));
                p.getTabelaVersao().setDono(rs.getString("TLNK_DONO"));

                p.getColuna().setCodigo(rs.getInt("TCOL_CODIGO_PK"));
                p.getColuna().setNome(rs.getString("TCOL_NOME"));
                p.getColuna().setNomeAmigavel(rs.getString("TCOL_NOME_AMIGAVEL"));

                p.getColunaVersao().setAcao(rs.getString("TLNK_ACAO").charAt(0));
                p.getColunaVersao().setTipoDadoPadrao(rs.getString("TLNK_TIPO_DADO"));
                p.getColunaVersao().setTamanhoDadoPadrao(rs.getDouble("TLNK_TAMANHO"));
                p.getColunaVersao().setAceitaNullPadrao(rs.getString("TLNK_ACEITA_NULL").charAt(0));

                p.getObjetoModel().setCodigo(rs.getInt("TOBJ_CODIGO_PK"));
                p.getObjetoModel().setNome(rs.getString("TOBJ_NOME"));
                p.getObjetoModel().setNomeAmigavel(rs.getString("TOBJ_NOME_AMIGAVEL"));

                model.getListaConsultarDocumento().add(p);
            }
        } catch (SQLException ex) {
            ex.getStackTrace();
        } finally {
            Desconectar(model.getNomeTela());
        }
        return model.getListaConsultarDocumento();
    }
}
